package main

//
//import (
//	"fmt"
//	"time"
//)
//
//// IntegratedSystem 整合系统
//type IntegratedSystem struct {
//	predictionStorage *PredictionStorage
//	predictionUpdater *PredictionUpdater
//	deviationAnalyzer *DeviationAnalyzer
//	planStorage       *JSONStorage
//
//	currentPrediction *PredictionCurve
//	currentPlan       *PlanResult
//	rules             UserRules
//}
//
//// NewIntegratedSystem 创建整合系统
//func NewIntegratedSystem(predictionDir, planDir string, rules UserRules) (*IntegratedSystem, error) {
//	// 初始化存储
//	predictionStorage, err := NewPredictionStorage(predictionDir)
//	if err != nil {
//		return nil, fmt.Errorf("failed to create prediction storage: %w", err)
//	}
//
//	planStorage, err := NewJSONStorage(planDir)
//	if err != nil {
//		return nil, fmt.Errorf("failed to create plan storage: %w", err)
//	}
//
//	// 初始化更新器和分析器
//	predictionUpdater := NewPredictionUpdater(predictionStorage)
//	deviationAnalyzer := NewDeviationAnalyzer()
//
//	return &IntegratedSystem{
//		predictionStorage: predictionStorage,
//		predictionUpdater: predictionUpdater,
//		deviationAnalyzer: deviationAnalyzer,
//		planStorage:       planStorage,
//		rules:             rules,
//	}, nil
//}
//
//// Initialize 初始化系统（创建初始预测曲线和补水计划）
//func (sys *IntegratedSystem) Initialize(
//	date string,
//	startTime time.Time,
//	initialLevel float64,
//	prediction30min []float64,
//	prediction3h []float64,
//	nextDayPrediction3h []float64,
//) error {
//
//	logTitle(LogLevelInfo, "系统初始化")
//	logMessage(LogLevelInfo, "日期: %s\n", date)
//	logMessage(LogLevelInfo, "开始时间: %s\n", startTime.Format(TimeLayout))
//	logMessage(LogLevelInfo, "初始水位: %.2f m³\n", initialLevel)
//	logSeparator(LogLevelInfo, "=", 60)
//
//	// 1. 创建初始预测曲线
//	logMessage(LogLevelInfo, "\n1. 创建初始预测曲线...\n")
//	sys.currentPrediction = CreateInitialPrediction(date, prediction30min, prediction3h, nextDayPrediction3h)
//
//	if err := sys.predictionStorage.SavePrediction(sys.currentPrediction); err != nil {
//		return fmt.Errorf("failed to save initial prediction: %w", err)
//	}
//
//	logMessage(LogLevelInfo, "✓ 初始预测曲线已保存 (版本 v%d)\n", sys.currentPrediction.Version)
//
//	// 2. 生成初始补水计划
//	logMessage(LogLevelInfo, "\n2. 生成初始补水计划...\n")
//	dp := NewDailyPlanner(
//		sys.rules,
//		startTime,
//		initialLevel,
//		sys.currentPrediction.Prediction3h,
//		sys.currentPrediction.Prediction30min,
//		sys.currentPrediction.NextDayPrediction3h,
//	)
//
//	tasks, finalLevel := dp.RunSimulationWithPersistence()
//	sys.currentPlan = NewPlanResult(dp, tasks, finalLevel)
//
//	if err := sys.planStorage.Save(sys.currentPlan); err != nil {
//		return fmt.Errorf("failed to save initial plan: %w", err)
//	}
//
//	logMessage(LogLevelInfo, "✓ 初始补水计划已保存 (任务数: %d)\n", len(tasks))
//	logMessage(LogLevelInfo, "✓ 预测最终水位: %.2f m³\n", finalLevel)
//
//	logSeparator(LogLevelInfo, "=", 60)
//	logMessage(LogLevelInfo, "\n✅ 系统初始化完成！\n\n")
//
//	return nil
//}
//
//// MonitorAndAdjust 监测并调整（每30分钟调用一次）
//func (sys *IntegratedSystem) MonitorAndAdjust(
//	actualUsage float64,
//	currentTime time.Time,
//	currentLevel float64,
//) (*UpdateDecision, error) {
//
//	logTitle(LogLevelInfo, fmt.Sprintf("监测与调整 [%s]", currentTime.Format(TimeLayout)))
//	logMessage(LogLevelInfo, "实际用水量: %.2f m³\n", actualUsage)
//	logMessage(LogLevelInfo, "当前可用水量: %.2f m³\n", currentLevel)
//	logSeparator(LogLevelInfo, "-", 60)
//
//	// 1. 获取当前预测值
//	current30minIndex := calculate30minIndex(currentTime)
//	if current30minIndex >= len(sys.currentPrediction.Prediction30min) {
//		return nil, fmt.Errorf("invalid time index")
//	}
//	if current30minIndex >= 1 {
//		current30minIndex = current30minIndex - 1
//	}
//	predictedUsage := sys.currentPrediction.Prediction30min[current30minIndex]
//	blockIndex := current30minIndex / 6
//
//	logMessage(LogLevelInfo, "预测用水量: %.2f m³\n", predictedUsage)
//	logMessage(LogLevelInfo, "偏差: %.1f%%\n", calculateDeviationPercent(actualUsage, predictedUsage))
//	logSeparator(LogLevelInfo, "-", 60)
//
//	// 2. 偏差分析
//	logMessage(LogLevelInfo, "\n📊 进行偏差分析...\n")
//	decision := sys.deviationAnalyzer.Analyze(actualUsage, predictedUsage, currentTime, blockIndex)
//
//	PrintDecision(decision)
//
//	// 3. 根据决策更新预测曲线
//	if decision.ShouldUpdate30min || decision.ShouldReaggregate3h {
//		logMessage(LogLevelInfo, "\n🔄 更新预测曲线...\n")
//
//		oldVersion := sys.currentPrediction.Version
//		updatedPrediction, err := sys.predictionUpdater.UpdatePredictionWithDecision(
//			sys.currentPrediction,
//			decision,
//			actualUsage,
//			currentTime,
//		)
//		if err != nil {
//			return decision, fmt.Errorf("failed to update prediction: %w", err)
//		}
//
//		// 比较版本变化
//		CompareVersions(sys.currentPrediction, updatedPrediction)
//
//		sys.currentPrediction = updatedPrediction
//		logMessage(LogLevelInfo, "✓ 预测曲线已更新 (v%d → v%d)\n", oldVersion, updatedPrediction.Version)
//	}
//
//	// 4. 如果需要，重新规划补水计划
//	if decision.ShouldReplan {
//		logMessage(LogLevelInfo, "\n🔄 重新规划补水计划...\n")
//
//		dp := NewDailyPlanner(
//			sys.rules,
//			currentTime,
//			currentLevel,
//			sys.currentPrediction.Prediction3h,
//			sys.currentPrediction.Prediction30min,
//			sys.currentPrediction.NextDayPrediction3h,
//		)
//
//		tasks, finalLevel := dp.RunSimulationWithPersistence()
//		newPlan := NewPlanResult(dp, tasks, finalLevel)
//
//		if err := sys.planStorage.Save(newPlan); err != nil {
//			return decision, fmt.Errorf("failed to save new plan: %w", err)
//		}
//
//		oldPlanID := sys.currentPlan.ID[:8]
//		sys.currentPlan = newPlan
//
//		logMessage(LogLevelInfo, "✓ 补水计划已重新规划\n")
//		logMessage(LogLevelInfo, "  旧计划ID: %s...\n", oldPlanID)
//		logMessage(LogLevelInfo, "  新计划ID: %s...\n", newPlan.ID[:8])
//		logMessage(LogLevelInfo, "  任务数: %d\n", len(tasks))
//		logMessage(LogLevelInfo, "  预测最终水位: %.2f m³\n", finalLevel)
//	}
//
//	logSeparator(LogLevelInfo, "=", 60)
//	logMessage(LogLevelInfo, "\n✅ 监测与调整完成\n\n")
//
//	return decision, nil
//}
//
//// GetCurrentPrediction 获取当前预测曲线
//func (sys *IntegratedSystem) GetCurrentPrediction() *PredictionCurve {
//	return sys.currentPrediction
//}
//
//// GetCurrentPlan 获取当前补水计划
//func (sys *IntegratedSystem) GetCurrentPlan() *PlanResult {
//	return sys.currentPlan
//}
//
//// PrintSystemStatus 打印系统状态
//func (sys *IntegratedSystem) PrintSystemStatus() {
//	logTitle(LogLevelInfo, "系统状态")
//
//	if sys.currentPrediction != nil {
//		logMessage(LogLevelInfo, "📈 当前预测曲线:\n")
//		logMessage(LogLevelInfo, "  版本: v%d\n", sys.currentPrediction.Version)
//		logMessage(LogLevelInfo, "  日期: %s\n", sys.currentPrediction.Date)
//		logMessage(LogLevelInfo, "  更新时间: %s\n", sys.currentPrediction.UpdatedAt.Format(TimeLayout))
//		logMessage(LogLevelInfo, "  更新原因: %s\n", sys.currentPrediction.UpdateReason)
//	}
//
//	logSeparator(LogLevelInfo, "-", 60)
//
//	if sys.currentPlan != nil {
//		logMessage(LogLevelInfo, "\n📋 当前补水计划:\n")
//		logMessage(LogLevelInfo, "  计划ID: %s...\n", sys.currentPlan.ID[:8])
//		logMessage(LogLevelInfo, "  创建时间: %s\n", sys.currentPlan.CreatedAt)
//		logMessage(LogLevelInfo, "  任务数: %d\n", sys.currentPlan.TaskCount)
//		logMessage(LogLevelInfo, "  总补水量: %.2f m³\n", sys.currentPlan.TotalRefillM3)
//		logMessage(LogLevelInfo, "  最终水位: %.2f m³\n", sys.currentPlan.FinalLevelM3)
//	}
//
//	logSeparator(LogLevelInfo, "=", 60)
//}
//
//// LoadHistory 加载历史数据
//func (sys *IntegratedSystem) LoadHistory(date string) error {
//	// 加载最新的预测曲线
//	prediction, err := sys.predictionStorage.LoadLatestPrediction(date)
//	if err != nil {
//		return fmt.Errorf("failed to load prediction: %w", err)
//	}
//	sys.currentPrediction = prediction
//
//	// 加载最新的补水计划
//	plan, err := sys.planStorage.GetLatest()
//	if err != nil {
//		return fmt.Errorf("failed to load plan: %w", err)
//	}
//	sys.currentPlan = plan
//
//	logMessage(LogLevelInfo, "✓ 历史数据已加载\n")
//	logMessage(LogLevelInfo, "  预测曲线: v%d\n", sys.currentPrediction.Version)
//	logMessage(LogLevelInfo, "  补水计划: %s...\n", sys.currentPlan.ID[:8])
//
//	return nil
//}
